#ifndef __Protocol_H__
#define __Protocol_H__

// 协议
#define info_size_max 1024

union Protocol
{
    char inif[info_size_max];

    // 通用协议
    struct GeneralProtocol
    {
        int select;                                // 选择
        char inif[info_size_max - sizeof(select)]; // 余下的空间
    } general;

    // 登陆协议
    struct LogInProtocol
    {
        int select;        // 选择
        char User[50];     // 账号
        char Password[50]; // 密码
    } general;

    // 单聊协议
    union PrivateChatProtocol
    {
        // 发送单聊请求
        struct SendChatRequest // 1
        {
            int type; // 通讯方式类型
        } sendRequest;

        // 接收好友列表
        struct ReceiveFriendList
        {
            int type;             // 通讯方式类型
            char friends[10][50]; // 好友列表，假设最多10个好友
        } receiveList;

        // 选择单聊用户
        struct SelectChatUser // 2
        {
            int type;              // 通讯方式类型
            char requester[50];    // 请求者用户名
            char selectedUser[50]; // 选择的好友用户名
        } selectUser;

        // 服务器对接确认
        struct ServerConnection // 3
        {
            int type;            // 通讯方式类型
            char requester[50];  // 请求者用户名
            char targetUser[50]; // 目标用户
        } serverConnection;

        // 单聊信息
        struct ChatMessage // 4
        {
            int type;                                                                              // 通讯方式类型
            char sender[50];                                                                       // 发送者用户名
            char receiver[50];                                                                     // 接收者用户名
            char message[info_size_max - sizeof(int) - (sizeof(char) * 50) - (sizeof(char) * 50)]; // 消息内容
        } chatMessage;

    } privateChat;

    // 群聊协议
    union GroupChatProtocol
    {

        // 创建群聊
        struct CreateGroupChat // 5
        {
            int type;           // 通讯方式类型
            char groupName[50]; // 群聊名称
            char creator[50];   // 创建者用户名
        } createGroup;

        // 加入群聊
        struct JoinGroupChat // 6
        {
            int type;             // 通讯方式类型
            char groupName[50];   // 群聊名称
            char participant[50]; // 参与者用户名
        } joinGroup;

    } GroupChatProtocol;

    // 文件协议
    union FileTransferProtocol
    {
        // 请求下载
        struct DownloadRequest
        {
            int type;          // 通讯方式类型
            char fileName[50]; // 请求下载的文件名
        } downloadRequest;

        // 文件名列表
        struct FileNameList
        {
            int type;               // 通讯方式类型
            char fileNames[10][50]; // 文件名列表，假设最多10个文件
        } fileNameList;

        // 要下载的文件名
        struct FileToDownload
        {
            int type;          // 通讯方式类型
            char fileName[50]; // 要下载的文件名
        } fileToDownload;

        // 发送/接收文件信息
        struct FileTransferInfo
        {
            int type; // 通讯方式类型
            // 文件内容

        } fileTransferInfo;
    };
};

#endif
